package com.itheima.leetcode.od.b.string;

import java.util.*;

/**
 * <h3>差值数组不同的字符串</h3>
 * 给你一个字符串数组 words ，每一个字符串长度都相同，令所有字符串的长度都为 n 。
 * <p>
 * 每个字符串 words[i] 可以被转化为一个长度为n - 1的 差值整数数组 difference[i] ，其中对于 0 <= j <= n - 2 有difference[i][j] = words[i][j+1] - words[i][j]。注意两个字母的差值定义为它们在字母表中 位置 之差，也就是说’a’ 的位置是 0 ，‘b’ 的位置是 1 ，‘z’ 的位置是 25 。
 * <p>
 * 比方说，字符串 “acb” 的差值整数数组是 [2 - 0, 1 - 2] = [2, -1] 。
 * words 中所有字符串 除了一个字符串以外 ，其他字符串的差值整数数组都相同。你需要找到那个不同的字符串。
 * <p>
 * 请你返回 words中 差值整数数组 不同的字符串。
 * <p>
 * 输入描述：
 * <p>
 * 第一行输入一个字符串，包含两个数字，空格分隔，数组长度m和数字n，n表示字符串的长度
 * <p>
 * 第二行输入一个字符串，m个长度为n的字符串，空格分隔
 * <p>
 * 输出描述：
 * <p>
 * 请返回 words中 差值整数数组不同的字符串。
 * <p>
 * 示例1：
 * <p>
 * 输入：
 * <p>
 * 3 4
 * <p>
 * abcd bcde cdeg
 * <p>
 * 输出：
 * cdeg
 * <p>
 * 说明：
 * bcde 和 cdef 的差值数组为 [1, 1, 1]，abcf 的为 [1, 1, 3]。
 * <p>
 * 示例2
 * <p>
 * 输入
 * <p>
 * 4 2
 * <p>
 * ab cd ef ac
 * <p>
 * 输出：
 * ac
 * <p>
 * 说明：
 * ab, cd, ef 的差值数组为 [1]，ac 的为 [2]。
 */
public class DifferentStringsInDifferenceArray {
    public static void main(String[] args) {
        /*Scanner scanner = new Scanner(System.in);

        // 读取第一行：数组长度m和字符串长度n
        int m = scanner.nextInt();
        int n = scanner.nextInt();
        scanner.nextLine(); // 消费换行符

        // 读取第二行：m个长度为n的字符串
        String[] words = scanner.nextLine().split(" ");

        // 调用函数找到差值数组不同的字符串
        String result = findDifferentString(words);

        // 输出结果
        System.out.println(result);

        scanner.close();*/

        // 读取第一行：数组长度m和字符串长度n
        int m = 3;
        int n = 4;

        // 读取第二行：m个长度为n的字符串
        String[] words = "abcd bcde cdeg".split(" ");

        // 调用函数找到差值数组不同的字符串
        System.out.println(findDifferentString(words));
    }

    /**
     * 找到字符串数组中差值整数数组不同的那个字符串
     *
     * @param words 字符串数组，每个字符串长度相同
     * @return 差值整数数组不同的字符串
     */
    public static String findDifferentString(String[] words) {
        /**
         * 计算单个字符串的差值整数数组
         *
         * @param word 输入字符串
         * @return 差值整数数组
         */
        // 内部方法：计算字符串的差值数组
        // Java中使用lambda表达式或者直接在方法内实现

        // 获取前两个字符串的差值数组
        int[] diff0 = getDifferenceArray(words[0]);  // 第一个字符串的差值数组
        int[] diff1 = getDifferenceArray(words[1]);  // 第二个字符串的差值数组

        // 如果前两个字符串的差值数组相同
        if (Arrays.equals(diff0, diff1)) {
            // 说明前两个字符串都是"正常"的，从第三个字符串开始查找不同的
            for (int i = 2; i < words.length; i++) {
                // 如果找到与前两个不同的差值数组，返回对应的字符串
                if (!Arrays.equals(diff0, getDifferenceArray(words[i]))) {
                    return words[i];
                }
            }
        }

        // 如果前两个字符串的差值数组不同
        // 需要通过第三个字符串来判断哪一个是不同的
        // 比较第一个字符串和第三个字符串的差值数组
        return Arrays.equals(diff0, getDifferenceArray(words[2])) ? words[1] : words[0];
    }

    /**
     * 计算单个字符串的差值整数数组
     *
     * @param word 输入字符串
     * @return 差值整数数组，长度为 word.length() - 1
     */
    private static int[] getDifferenceArray(String word) {
        // 初始化差值数组，长度为字符串长度减1
        int[] diff = new int[word.length() - 1];

        // 计算相邻字符的ASCII值差值
        for (int i = 0; i < word.length() - 1; i++) {
            // charAt()获取字符，计算相邻字符的差值
            diff[i] = word.charAt(i + 1) - word.charAt(i);
        }

        return diff;
    }
}